package com.njmaomao.gj.pyot.domain.wechat.wechatapi;

import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;

import java.text.ParseException;
import java.util.Date;

/**
 * 支付结果通知
 */
@XStreamAlias("xml")
@Getter
@Setter
public class PayNotification {

    // 返回状态码 必填[是] SUCCESS/FAIL 此字段是通信标识，非交易标识，交易是否成功需要查看result_code来判断
    @XStreamAlias("return_code")
    private String returnCode;

    // 返回信息 必填[否] 返回信息，如非空，为错误原因
    @XStreamAlias("return_msg")
    private String returnMsg;

    // 公众账号ID 必填[是] 微信分配的公众账号ID（企业号corpid即为此appId）
    private String appid;

    // 商户号 必填[是] 微信支付分配的商户号
    @XStreamAlias("mch_id")
    private String mchId;

    // 设备号 必填[否] 微信支付分配的终端设备号，
    @XStreamAlias("device_info")
    private String deviceInfo;

    // 随机字符串 必填[是] 随机字符串，不长于32位
    @XStreamAlias("nonce_str")
    private String nonceStr;

    // 签名 必填[是] 签名，详见签名算法
    private String sign;

    // 签名类型 必填[否] 签名类型，目前支持HMAC-SHA256和MD5，默认为MD5
    @XStreamAlias("sign_type")
    private String signType;

    // 业务结果 必填[是] SUCCESS/FAIL
    @XStreamAlias("result_code")
    private String resultCode;

    // 错误代码 必填[否] 错误返回的信息描述
    @XStreamAlias("err_code")
    private String errCode;

    // 错误代码描述 必填[否] 错误返回的信息描述
    @XStreamAlias("err_code_des")
    private String errCodeDes;

    // 用户标识 必填[是] 用户在商户appid下的唯一标识
    private String openid;

    // 是否关注公众账号 必填[否] 用户是否关注公众账号，Y-关注，N-未关注，仅在公众账号类型支付有效
    @XStreamAlias("is_subscribe")
    private String isSubscribe;

    // 交易类型 必填[是] JSAPI、NATIVE、APP
    @XStreamAlias("trade_type")
    private String tradeType;

    // 付款银行 必填[是] 银行类型，采用字符串类型的银行标识，银行类型见银行列表
    @XStreamAlias("bank_type")
    private String bankType;

    // 订单金额 必填[是] 订单总金额，单位为分
    @XStreamAlias("total_fee")
    private int totalFee;

    // 应结订单金额 必填[否] 应结订单金额=订单金额-非充值代金券金额，应结订单金额<=订单金额。
    @XStreamAlias("settlement_total_fee")
    private int settlementTotalFee ;

    // 货币种类 必填[否] 货币类型，符合ISO4217标准的三位字母代码，默认人民币：CNY，其他值列表详见货币类型
    @XStreamAlias("fee_type")
    private String feeType;

    // 现金支付金额 必填[是] 现金支付金额订单现金支付金额，详见支付金额
    @XStreamAlias("cash_fee")
    private int cashFee;

    // 现金支付货币类型 必填[否] 货币类型，符合ISO4217标准的三位字母代码，默认人民币：CNY，其他值列表详见货币类型
    @XStreamAlias("cash_fee_type")
    private String cashFeeType;

    // 总代金券金额 必填[否] 代金券金额<=订单金额，订单金额-代金券金额=现金支付金额，详见支付金额
    @XStreamAlias("coupon_fee")
    private int couponFee;

    // 代金券使用数量 必填[否] 代金券使用数量
    @XStreamAlias("coupon_count")
    private int couponCount;

    // 代金券类型 必填[否 ] CASH--充值代金券  NO_CASH---非充值代金券 并且订单使用了免充值券后有返回（取值：CASH、NO_CASH）。$n为下标,从0开始编号，举例：coupon_type_0
    //@XStreamAlias("coupon_type_$n")
    //private String couponType_$n ;

    // 代金券ID 必填[否] 代金券ID,$n为下标，从0开始编号
    //@XStreamAlias("coupon_id_$n")
    //private String couponId_$n;

    // 单个代金券支付金额 必填[否] 单个代金券支付金额,$n为下标，从0开始编号
    //@XStreamAlias("coupon_fee_$n")
    //private int couponFee_$n;

    // 微信支付订单号 必填[是] 微信支付订单号
    @XStreamAlias("transaction_id")
    private String transactionId;

    // 商户订单号 必填[是] 商户系统内部订单号，要求32个字符内，只能是数字、大小写字母_-|*@ ，且在同一个商户号下唯一。
    @XStreamAlias("out_trade_no")
    private String outTradeNo;

    // 商家数据包 必填[否] 商家数据包，原样返回
    private String attach;

    // 支付完成时间 必填[是] 支付完成时间，格式为yyyyMMddHHmmss，如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则
    @XStreamAlias("time_end")
    private String timeEnd;

    /**
     * 获取Date格式的支付成功时间。
     * 如果获取错误，将返回当前时间
     * @return
     */
    public Date getTimeEndForDate(){
        try {
            return DateUtils.parseDate(getTimeEnd(),"yyyyMMddHHmmss");
        } catch (ParseException e) {
            return new Date();
        }
    }


    public boolean success(){
        return StringUtils.equalsIgnoreCase(getResultCode(),"SUCCESS")
                && StringUtils.equalsIgnoreCase(getReturnCode(),"SUCCESS");
    }

}
